/**
 * 
 */
package rer.persistencia;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

import rer.model.Funcionario;
import rer.util.ConexaoJDBC_mysql;

/**
 * @author Henrique Serrat
 * @since 15/11/2014
 *
 */

public class FuncionarioDAO implements IFuncionarioDAO {

	private Statement statement;
	private PreparedStatement preparedStatement;
	private ResultSet resultSet;
	private String query;
	private Funcionario funcionario = new Funcionario();
	private List<Funcionario> funcionarios;
	private Connection conexao = ConexaoJDBC_mysql.getConnection();
	
	
	/* (non-Javadoc)
	 * @see rer.persistencia.IFuncionarioDAO#cadastrar(rer.model.Funcionario)
	 */
	@Override
	public Boolean cadastrar(Funcionario funcionario) {
		// TODO Auto-generated method stub
		try {
			//System.out.println("Aqui QUERY");
			query = "INSERT INTO `funcionarios`(`nomeFunc`, `cpfFunc`, `rgFunc`,"
					+ " `dobFunc`, `ecFunc`, `natFunc`, `sexoFunc`, `formacaoFunc`,"
					+ " `telFunc`, `tel2Func`, `celFunc`, `tipoFuncionario_id`,"
					+ " `statusFunc`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'A')";
									

			preparedStatement = conexao.prepareStatement(query);
			
			preparedStatement.setString(1, funcionario.getNomeFunc());
			preparedStatement.setString(2, funcionario.getCpfFunc());
			preparedStatement.setString(3, funcionario.getRgFunc());
			preparedStatement.setDate(4, new Date(funcionario.getDobFunc().getTime()));
			preparedStatement.setString(5, funcionario.getEcFunc());
			preparedStatement.setString(6, funcionario.getNatFunc());
			preparedStatement.setString(7, funcionario.getSexoFunc());
			preparedStatement.setString(8, funcionario.getFormacaoFunc());
			preparedStatement.setString(9, funcionario.getTelFunc());
			
			if(funcionario.getTel2Func() == null){
				preparedStatement.setNull(10, Types.NULL);
			}else{
				preparedStatement.setString(10, funcionario.getTel2Func());
			}
			
			if(funcionario.getCelFunc() == null){
				preparedStatement.setNull(11, Types.NULL);
			}else{
				preparedStatement.setString(11, funcionario.getCelFunc());
			}
			
			preparedStatement.setInt(12, funcionario.getTipoFunc());
			//preparedStatement.setString(14, funcionario.getStatusFunc());
			

			preparedStatement.execute();
			
			return true;
			
			
		} catch (SQLException erro) {
			// TODO: handle exception
			System.out.println(erro.getMessage());		
		}finally{
			try {
				preparedStatement.close();
				
			} catch (SQLException e) {
				// TODO: handle exception
				e.printStackTrace();
				System.out.println("Erro ao fechar o statement");
			}
			System.out.println("Finally");
		}
		
		return false;
	}

	/* (non-Javadoc)
	 * @see rer.persistencia.IFuncionarioDAO#editar(int)
	 */
	@Override
	public Boolean editar(Funcionario funcionario) {
		// TODO Auto-generated method stub
		
		try{
			query = "UPDATE `funcionarios` SET `nomeFunc`= ?,`cpfFunc`= ?,`rgFunc`= ?,`dobFunc`= ?, `ecFunc`= ?,`natFunc`= ?,`sexoFunc`= ?,"
					+ "`formacaoFunc`= ?,`telFunc`= ?,`tel2Func`= ?,`celFunc`= ?,`tipoFuncionario_id`= ?,`statusFunc`= ? "
					+ "WHERE `funcionarios`.`idFunc` = ?";
			
			preparedStatement = conexao.prepareStatement(query);
			
			preparedStatement.setString(1, funcionario.getNomeFunc());
			preparedStatement.setString(2, funcionario.getCpfFunc());
			preparedStatement.setString(3, funcionario.getRgFunc());
			preparedStatement.setDate(4, new Date(funcionario.getDobFunc().getTime()));
			preparedStatement.setString(5, funcionario.getEcFunc());
			preparedStatement.setString(6, funcionario.getNatFunc());
			preparedStatement.setString(7, funcionario.getSexoFunc());
			preparedStatement.setString(8, funcionario.getFormacaoFunc());
			preparedStatement.setString(9, funcionario.getTelFunc());
			
			preparedStatement.setString(10, funcionario.getTel2Func());//tratar null
			
			preparedStatement.setString(11, funcionario.getCelFunc());//tratar null
			
			
			preparedStatement.setInt(12, funcionario.getTipoFunc());
			preparedStatement.setString(13, funcionario.getStatusFunc());
			preparedStatement.setInt(14, funcionario.getIdFunc());
			
			preparedStatement.executeUpdate();
			
			
			System.out.println("Dados Funcionario Alterados com sucesso - DAO");
			
			return true;

		}catch(SQLException erro){
			System.out.println(erro.getMessage());
		}
		return false;
	}

	/* (non-Javadoc)
	 * @see rer.persistencia.IFuncionarioDAO#deletar(int)
	 */
	@Override
	public Boolean deletar(int id) {
		// TODO Auto-generated method stub
		
		try {
			
				query ="UPDATE `funcionarios` SET `status`='I' WHERE idFunc = ?";
				
				
				preparedStatement = conexao.prepareStatement(query);
				
				preparedStatement.setInt(1, id);
				
				preparedStatement.executeUpdate();
				
				System.out.println("Funcionario apagado com sucesso!");
				return true;
			} catch (SQLException e) {
				System.out.println(e.getMessage());
		}
		return false;
	}

	/* (non-Javadoc)
	 * @see rer.persistencia.IFuncionarioDAO#listar()
	 */
	@Override
	public List<Funcionario> listar() {
		// TODO Auto-generated method stub
		funcionarios = null;
		
		try {
			
			query = "SELECT * FROM db_ceirr.funcionarios";
			
			statement = conexao.createStatement();
			resultSet = statement.executeQuery(query);
			
			funcionarios = new ArrayList<Funcionario>();
			
			while(resultSet.next()){
				funcionario = new Funcionario();
				
				funcionario.setIdFunc(resultSet.getInt("idFunc"));
				funcionario.setNomeFunc(resultSet.getString("nomeFunc"));
				funcionario.setCpfFunc(resultSet.getString("cpfFunc"));
				funcionario.setRgFunc(resultSet.getString("rgFunc"));
				funcionario.setDobFunc(resultSet.getDate("dobFunc"));
				funcionario.setEcFunc(resultSet.getString("ecFunc"));
				funcionario.setNatFunc(resultSet.getString("natFunc"));
				funcionario.setSexoFunc(resultSet.getString("sexoFunc"));
				funcionario.setFormacaoFunc(resultSet.getString("formacaoFunc"));
				funcionario.setTelFunc(resultSet.getString("telFunc"));
				funcionario.setTel2Func(resultSet.getString("tel2Func"));
				funcionario.setCelFunc(resultSet.getString("celFunc"));
				funcionario.setTipoFunc(resultSet.getInt("tipoFuncionario_id"));
				funcionario.setStatusFunc(resultSet.getString("statusFunc"));
				
				funcionarios.add(funcionario);
			}
			
		}catch(SQLException erro){
			System.out.println(erro.getMessage());
		}
		
		try {
			statement.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("\n Erro ao fechar o objeto preparedStatement.");
		}
		System.out.println("\nSucesso pesquisa Funcionario");
		return funcionarios;
		
	}
	
	public Funcionario pesquisaFuncionario(int id){
		
		funcionario = null;
		
		try {
			
			query = "SELECT * FROM db_ceirr.funcionarios WHERE idFunc = ?";

			preparedStatement = conexao.prepareStatement(query);

			preparedStatement.setInt(1, id);

			resultSet = preparedStatement.executeQuery();

			if (resultSet.next()) {

				funcionario = new Funcionario();

				funcionario.setIdFunc(resultSet.getInt("idFunc"));
				funcionario.setNomeFunc(resultSet.getString("nomeFunc"));
				funcionario.setCpfFunc(resultSet.getString("cpfFunc"));
				funcionario.setRgFunc(resultSet.getString("rgFunc"));
				funcionario.setDobFunc(resultSet.getDate("dobFunc"));
				funcionario.setEcFunc(resultSet.getString("ecFunc"));
				funcionario.setNatFunc(resultSet.getString("natFunc"));
				funcionario.setSexoFunc(resultSet.getString("sexoFunc"));
				funcionario.setFormacaoFunc(resultSet.getString("formacaoFunc"));
				funcionario.setTelFunc(resultSet.getString("telFunc"));
				funcionario.setTel2Func(resultSet.getString("tel2Func"));
				funcionario.setCelFunc(resultSet.getString("celFunc"));
				funcionario.setTipoFunc(resultSet.getInt("tipoFuncionario_id"));
				funcionario.setStatusFunc(resultSet.getString("statusFunc"));
				
			}
			
			System.out.println("Pesquisa funcionario feita");
			
		} catch (SQLException e) {
			// TODO: handle exception
			System.out.println(e.getMessage());
		}
		try {
			preparedStatement.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("\n Erro ao fechar o objeto preparedStatement.");
		}
		System.out.println("\nSucesso pesquisa alunos");
		
		return funcionario;
	}
	
	@Override
	public List<Funcionario> listarFuncAtivos() {
		// TODO Auto-generated method stub
		funcionarios = null;
		
		try {
			
			query = "SELECT * FROM `funcionarios` WHERE `tipoFuncionario_id` LIKE 1 AND `statusFunc` LIKE 'A' ";
			
			statement = conexao.createStatement();
			
			resultSet = statement.executeQuery(query);
			
			funcionarios = new ArrayList<Funcionario>();
			
			while(resultSet.next()){
				funcionario = new Funcionario();
				
				funcionario.setIdFunc(resultSet.getInt("idFunc"));
				funcionario.setNomeFunc(resultSet.getString("nomeFunc"));
				funcionario.setCpfFunc(resultSet.getString("cpfFunc"));
				funcionario.setRgFunc(resultSet.getString("rgFunc"));
				funcionario.setDobFunc(resultSet.getDate("dobFunc"));
				funcionario.setEcFunc(resultSet.getString("ecFunc"));
				funcionario.setNatFunc(resultSet.getString("natFunc"));
				funcionario.setSexoFunc(resultSet.getString("sexoFunc"));
				funcionario.setFormacaoFunc(resultSet.getString("formacaoFunc"));
				funcionario.setTelFunc(resultSet.getString("telFunc"));
				funcionario.setTel2Func(resultSet.getString("tel2Func"));
				funcionario.setCelFunc(resultSet.getString("celFunc"));
				funcionario.setTipoFunc(resultSet.getInt("tipoFuncionario_id"));
				funcionario.setStatusFunc(resultSet.getString("statusFunc"));
				
				funcionarios.add(funcionario);
			}
			
		}catch(SQLException erro){
			System.out.println(erro.getMessage());
		}
		
		try {
			statement.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("\n Erro ao fechar o objeto preparedStatement.");
		}
		System.out.println("\nSucesso pesquisa funcionario ativo");
		return funcionarios;
		
	}


}
